import time

import requests

# Ollama 嵌入 API 地址（默认本地）
OLLAMA_API = "http://localhost:11434/api/embeddings"

# 使用 Ollama 的模型名（例如 nomic-embed-text）
MODEL_NAME = "dengcao/Qwen3-Embedding-0.6B:Q8_0"


# 获取 Ollama 嵌入
def get_ollama_embedding(text) -> list[float]:
    payload = {
        "model": MODEL_NAME,
        "prompt": text
    }
    response = requests.post(OLLAMA_API, json=payload)
    if response.status_code == 200:
        return response.json()['embedding']
    else:
        raise Exception(f"Failed to get embedding: {response.text}")


# 示例 FAQ 数据
knowledge_data = [
    {
        "question": "Java 中的 main 方法有什么作用？",
        "answer": "main 方法是 Java 程序的入口点。JVM 会从 main 方法开始执行程序。它的标准签名是 `public static void main(String[] args)`。"
    },
    {
        "question": "什么是面向对象编程（OOP）？",
        "answer": "面向对象编程是一种编程范式，基于类和对象的概念。它支持封装、继承和多态等特性，用于组织和管理复杂的代码结构。"
    },
    {
        "question": "Java 中的 final 关键字有什么作用？",
        "answer": "final 关键字可以用来修饰类、方法和变量。修饰类时，表示该类不能被继承；修饰方法时，表示该方法不能被重写；修饰变量时，表示该变量的值不能被修改。"
    },
    {
        "question": "如何在 Java 中实现多线程？",
        "answer": "可以通过以下两种方式实现多线程：1. 继承 Thread 类并重写 run 方法；2. 实现 Runnable 接口并传递给 Thread 构造器。推荐使用第二种方式，因为它更灵活。"
    },
    {
        "question": "什么是 Java 的垃圾回收机制（GC）？",
        "answer": "垃圾回收机制是 Java 自动管理内存的一种机制。它通过垃圾回收器定期回收不再使用的对象所占用的内存空间，从而避免内存泄漏。"
    },
    {
        "question": "Java 中的异常处理机制是什么？",
        "answer": "Java 提供了 try-catch-finally 和 throw/throws 机制来处理异常。try 块用于捕获异常，catch 块用于处理异常，finally 块无论是否发生异常都会执行。"
    },
    {
        "question": "什么是 Java 集合框架？",
        "answer": "Java 集合框架是一个用于存储和操作一组对象的统一架构。它包括 List、Set、Map 等接口及其实现类，例如 ArrayList、HashSet 和 HashMap。"
    },
    {
        "question": "Java 中的接口和抽象类有什么区别？",
        "answer": "接口只能包含抽象方法和常量，默认方法从 Java 8 开始支持；抽象类可以包含具体方法和成员变量。一个类可以实现多个接口，但只能继承一个抽象类。"
    },
    {
        "question": "Java 中的泛型有什么作用？",
        "answer": "泛型允许在定义类、接口和方法时使用类型参数，从而提高代码的复用性和类型安全性。例如，`List<String>` 表示一个只存储字符串的列表。"
    },
    {
        "question": "什么是 Java 的反射机制？",
        "answer": "反射机制允许程序在运行时动态获取类的信息（如方法、字段和构造器），并操作对象。虽然功能强大，但可能会影响性能。"
    }
]

# 使用 database.py 中的连接池获取连接
from config.database import db

conn = db.getconn()
cur = conn.cursor()

# 插入数据并生成向量
for item in knowledge_data:
    try:
        embedding = get_ollama_embedding(item["question"])
        cur.execute(
            "INSERT INTO knowledge (question, answer, embedding) VALUES (%s, %s, %s)",
            (item["question"], item["answer"], embedding)
        )
        time.sleep(0.1)  # 避免请求过快
    except Exception as e:
        print(f"Error inserting {item['question']}: {e}")

conn.commit()
cur.close()
db.putconn(conn)
